Userspace Driver
Øvelse 12

Til øvelsen har vi kigget på det udleverede eksempel, derudover har vi kigget rundt på nettet for at hente inspiration til at løse opgaven. nogle af de side vi har benyttet er How to access GPIO og ud fra denne har vi bygget vores kode.
biblioteker som <sys/mman.h> som kan mappe. Denne bruges til at mappe det fysiske hukommelse in i den virtuelle hukommelse og gør at vi kan arbejde med den.

Da vi ønkser at tilgå via den fysiske memory åbnes filen igennem /dev/mem.

følgende adresser benyttes
off_t target = 0x49056034;
off_t targetout = 0x4905603C;
Efter dette toogler vi outputtet med den følgende kode
virt_addr = map_base + (target & MAP_MASK);
 
  // set gpio
  *(unsigned long *) virt_addr = 0xFFFFFF0F;
 
  // remap for stuff
  virt_addr = map_base + (targetout & MAP_MASK);
  while(1)
  {
    *(unsigned long *) virt_addr = 0x00000000;
    printf("Sets gpio to low! \n");
    printf("Sleep 5 sec.\n");
    for(i=0; i<5; i++)
    {
      sleep(1);
    }
    *(unsigned long *) virt_addr = 0x000000F0;
    printf("Sets gpio to high! \n");
    printf("Sleep 5 sec.\n");
    for(i=0; i<5; i++)
    {
      sleep(1);
    }
  }
I programmet castes virt_addr til en unsigned long, så det er den pointer peger på. Efter dette vælges der havd der skal skrives til registres og der fortsættes med GPIO INOUT

for at sikre at tingende forløber korrekt, sættes alle output til 0. På voltmeteret aflæses 0V, der bliver så talt 5 sec. og outputtet sættes til 1 og 5V blvier aflæst.

root@beagleboard:~# ./userspacedriver
/dev/mem opened.
Memory mapped at address 0x401cd000.
Sets gpio to low!
Sleep 5 sec.
Sets gpio to high!
Sleep 5 sec.

B)
Vi leger lidt rundt med det udleverede program, compiler det og kørte det.
Når programmet køre, looper noget af koden og på skærmen udskrives der: worst

i følgende del af koden ændres skeduleringspolitikken:

FIFO = 16373144
OTHER = 19661279
RR = 15902525